﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Configuration.Install;
using System.ServiceProcess;


namespace Sd2WinServiceRunner
{
    class Program
    {
        static void Main(string[] args)
        {
            string winservicename = "PharmMonitorServ";
            string curdir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string exeFileName = curdir + @"\" + winservicename + ".exe";

            LogFile logfile = new LogFile(curdir + @"\Sd2WinServiceRunnerLog.txt");
            try
            {
                if (File.Exists(exeFileName))
                {
                    ServiceController sc;
                    string res = WriteHelp();

                    if (res == "-inst")
                    {
                        ManagedInstallerClass.InstallHelper(new[] { exeFileName });
                        logfile.WriteLine("Служба установлена");
                        sc = new ServiceController(winservicename);
                        logfile.WriteLine("Запуск службы");
                        sc.Start();
                        sc.WaitForStatus(ServiceControllerStatus.Running);
                        logfile.WriteLine("Служба запущена");
                    }
                    if (res == "-run")
                    {
                        sc = new ServiceController(winservicename);
                        logfile.WriteLine("Запуск службы");
                        sc.Start();
                        sc.WaitForStatus(ServiceControllerStatus.Running);
                        logfile.WriteLine("Служба запущена");
                    }
                    if (res == "-uninst")
                    {
                        try
                        {
                            sc = new ServiceController(winservicename);
                            logfile.WriteLine("Остановка службы");
                            sc.Stop();
                            sc.WaitForStatus(ServiceControllerStatus.Stopped);
                            logfile.WriteLine("Служба остановлена");
                        }
                        catch (Exception ex)
                        {
                            logfile.WriteLine("Исключение: " + ex.Message);
                        }
                        ManagedInstallerClass.InstallHelper(new[] { "/u", exeFileName });
                        logfile.WriteLine("Служба удалена");
                    }
                    if (res == "-stop")
                    {
                        sc = new ServiceController(winservicename);
                        logfile.WriteLine("Остановка службы");
                        sc.Stop();
                        sc.WaitForStatus(ServiceControllerStatus.Stopped);
                        logfile.WriteLine("Служба остановлена");
                    }
                    if (res == "-close")
                    {
                        logfile.WriteLine("Приложение закрыто без каких либо действий");
                    }
                }
            }
            catch (Exception ex)
            {
                logfile.WriteLine("Исключение: " + ex.Message + ex.Data);
            }
        }

        static string WriteHelp()
        {
            Console.WriteLine("Параметры:");
            Console.WriteLine("-inst - установка службы");
            Console.WriteLine("-uninst - удаление службы");
            Console.WriteLine("-stop - остановка службы");
            Console.WriteLine("-run - запуск службы");
            Console.WriteLine("-close - закрыть приложение");
            Console.WriteLine("Введите параметр: ");
            return Console.ReadLine();
        }
    }

    public class LogFile
    {
        StreamWriter sw;

        public LogFile(string path)
        {
            sw = new StreamWriter(path);
        }

        public void WriteLine(string str)
        {
            sw.WriteLine(str);
            sw.Flush();
        }
    }
}
